---
title: 'Get started with GCP Pub/Sub'
sidebarTitle: 'GCP Pub/Sub'
description: 'Stream Postgres changes to a Google Cloud Pub/Sub topic in minutes. Build real-time data pipelines with Google Cloud Pub/Sub and Postgres change data capture (CDC).'
---

import QuickstartInitialSteps from '/snippets/quickstart-initial-steps.mdx';
import QuickstartSourceStep from '/snippets/quickstart-source-step.mdx';
import QuickstartBackfillStep from '/snippets/quickstart-backfill-step.mdx';

In this quickstart, you'll create a real-time data pipeline that streams changes from a Postgres database to a Google Cloud Pub/Sub topic. You'll:

- Boot Sequin
- Connect to a sample playground database
- Configure a Pub/Sub topic to receive database changes
- See your changes flow in real-time

By the end, you'll have hands-on experience setting up Postgres change data capture (CDC) with Sequin and GCP Pub/Sub.

<Tip>
  This is the quickstart for streaming Postgres to GCP Pub/Sub. See the [how-to guide](/how-to/stream-postgres-to-gcp-pubsub) for an explanation of how to use the GCP Pub/Sub sink or the [reference](/reference/sinks/gcp-pubsub) for details on all configuration options.
</Tip>

## Prerequisites

- A Google Cloud project with Pub/Sub enabled
- A service account with Pub/Sub permissions

For this quickstart, you can use an existing service account with broad Pub/Sub permissions. For production use cases, we recommend creating a dedicated service account for Sequin with these specific roles:

- `roles/pubsub.publisher`
- `roles/pubsub.viewer`

For more information on creating a service account, see the [how-to guide for Pub/Sub](/how-to/stream-postgres-to-gcp-pubsub#create-a-service-account).

<Steps titleSize="h2">
 <Step title="Create a Pub/Sub Topic" icon="google">
  If you don't already have a Pub/Sub topic:

  1. Navigate to the [Pub/Sub Topics page](https://console.cloud.google.com/cloudpubsub/topic/list) in your Google Cloud Console
  2. Click "CREATE TOPIC"
  3. Enter a topic ID for this tutorial (e.g., "products")
  4. Click "CREATE"

  Make note of your:
  - Google Cloud project ID (e.g., "my-project-123")
  - Pub/Sub topic ID (e.g., "products")
 </Step>

 <QuickstartInitialSteps />
 <Step title="Create a Pub/Sub Sink" icon="google">
  With the playground database connected, you can create a [sink](/reference/sinks/overview). This sink will send changes to the `products` table to your Pub/Sub topic:

  <Steps>
    <Step title="Navigate to Sinks">
      Click "Sinks" in the sidebar navigation, then click "Create Sink".
    </Step>

    <Step title="Select sink type">
      Select "Google Cloud Pub/Sub" as the sink type and click "Continue".
    </Step>

    <QuickstartSourceStep />
    <QuickstartBackfillStep />

    <Step title='Configure "Pub/Sub Configuration"'>
      In the "Pub/Sub Configuration" card, enter your Pub/Sub details:

      - Project ID: Your Google Cloud project ID
      - Topic ID: The Pub/Sub topic to stream to (e.g., "products")
      - Service Account Credentials: Paste your service account JSON key file contents

      <Frame>
        <img style={{ maxWidth: '700px' }} src="/images/quickstart/gcp-pubsub/pubsub-config-card.png" alt="Pub/Sub configuration card" />
      </Frame>
    </Step>

    <Step title="Test the connection">
      At the bottom of the form, click the "Test Connection" button. If you provided proper credentials, it should succeed.

      <Check>
        Sequin can connect to your Pub/Sub topic.
      </Check>
    </Step>

    <Step title="Create the sink">
      You can leave the rest of the defaults. As configured, the Pub/Sub topic will first receive a backfill of all rows currently in the `products` table. Then, it will receive all changes to the `products` table in real-time.

      Click "Create Sink" to finish setting up your Pub/Sub sink.
    </Step>
  </Steps>
 </Step>

  <Step title="See changes flow to your Pub/Sub topic" icon="waveform-lines">
    On the new sink's overview page, you should see the "Health" status turn green, indicating data is flowing to your Pub/Sub topic.

    Let's confirm messages are flowing:

    <Steps>
    <Step title="Messages tab">
      Click the "Messages" tab. You'll see a list of the recently delivered messages:

      <Frame>
        <img style={{ maxWidth: '700px' }} src="/images/quickstart/gcp-pubsub/messages-tab.png" alt="List of recently delivered messages" />
      </Frame>

      <Check>
        Sequin indicates it backfilled the `products` table to your Pub/Sub topic.
      </Check>
    </Step>
      <Step title="View in Pub/Sub Console">
        In the Google Cloud Console:
        1. Navigate to your Pub/Sub topic
        2. Click on the "MESSAGES" tab
        3. Under "Step 2", select a Cloud Pub/Sub subscription
        4. Click "PULL" to see messages in the topic

        You should see a list of messages appear in the table below. The messages are [`read` events](/reference/messages) from the initial backfill of the `products` table.

        <Check>
          Messages are flowing from Sequin to your Pub/Sub topic.
        </Check>
      </Step>

      <Step title="Make some changes">
        Let's make some changes to the `products` table and see them flow to your topic.

        In your terminal, run the following command to insert a new row into the `products` table:

        ```bash
        docker exec -i sequin-sequin_postgres-1 \
          psql -U postgres -d sequin_playground -c \
          "insert into products (name, price) values ('Organic Honey (16 oz)', 12.99);"
        ```

        In the Pub/Sub Console, click "PULL" again to see the new message appear.

        Feel free to try other changes:

        <AccordionGroup>
          <Accordion title="Update a product's price">
            ```bash
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "update products set price = 7.99 where name = 'Avocados (3 pack)';"
            ```
          </Accordion>

          <Accordion title="Change a product's name">
            ```bash
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "update products set name = 'Organic Avocados (3 pack)' where name = 'Avocados (3 pack)';"
            ```
          </Accordion>

          <Accordion title="Delete a product">
            ```bash
            docker exec -i sequin-sequin_postgres-1 \
              psql -U postgres -d sequin_playground -c \
              "delete from products where name = 'Blueberries (6 oz)';"
            ```
          </Accordion>
        </AccordionGroup>

        Each change will appear in your Pub/Sub topic within a few seconds.
      </Step>
    </Steps>
  </Step>
</Steps>

<Check>
  Great work!
</Check>

You've successfully:

- Set up a complete Postgres change data capture pipeline
- Loaded existing data through a backfill
- Made changes to the `products` table
- Verified changes are flowing to your Pub/Sub topic

## Ready to stream

Now you're ready to connect your own database to Sequin and start streaming changes:

<CardGroup cols={2}>
  <Card title="Guide: Connect Postgres" icon="elephant" href="/connect-postgres">
    Connect your Postgres database to Sequin.
  </Card>
  <Card title="Guide: Setting up a Pub/Sub sink" icon="google" href="/how-to/stream-postgres-to-gcp-pubsub">
    Setup a Pub/Sub sink to send changes to your topic.
  </Card>
</CardGroup>